acpi_table_parse(ACPI_HPET, acpi_parse_hpet);
+ acpi_dmar_init();
+
return 0;
}
spin_lock_init(&d->arch.hvm_domain.pbuf_lock);
spin_lock_init(&d->arch.hvm_domain.irq_lock);
- rc = iommu_domain_init(d);
+ rc = paging_enable(d, PG_refcounts|PG_translate|PG_external);
if ( rc != 0 )
return rc;
- rc = paging_enable(d, PG_refcounts|PG_translate|PG_external);
+ rc = iommu_domain_init(d);
if ( rc != 0 )
return rc;
hvm_init_ioreq_page(d, &d->arch.hvm_domain.ioreq);
hvm_init_ioreq_page(d, &d->arch.hvm_domain.buf_ioreq);
- return hvm_funcs.domain_initialise(d);
+ rc = hvm_funcs.domain_initialise(d);
+ if ( rc != 0 )
+ release_devices(d);
+
+ return rc;
}
void hvm_domain_relinquish_resources(struct domain *d)
void hvm_domain_destroy(struct domain *d)
{
+ release_devices(d);
hvm_funcs.domain_destroy(d);
}
#include "msi.h"
#define VTDPREFIX
-static inline int request_irq(int vector, void *func,
- int flags, char *name, void *data)
-{
- return -ENOSYS;
-}
-
extern void print_iommu_regs(struct acpi_drhd_unit *drhd);
extern void print_vtd_entries(struct domain *d, int bus, int devfn,
unsigned long gmfn);
struct acpi_drhd_unit *drhd;
struct iommu *iommu;
- if (list_empty(&acpi_drhd_units))
+ if (!vtd_enabled)
return 0;
INIT_LIST_HEAD(&hd->pdev_list);
#include <xen/compat.h>
#include <asm/current.h>
#include <asm/smpboot.h>
+#include <asm/iommu.h>
/* opt_noirqbalance: If true, software IRQ balancing/affinity is disabled. */
int opt_noirqbalance = 0;
spin_unlock(&desc->lock);
}
+int request_irq(unsigned int irq,
+ void (*handler)(int, void *, struct cpu_user_regs *),
+ unsigned long irqflags, const char * devname, void *dev_id)
+{
+ struct irqaction * action;
+ int retval;
+
+ /*
+ * Sanity-check: shared interrupts must pass in a real dev-ID,
+ * otherwise we'll have trouble later trying to figure out
+ * which interrupt is which (messes up the interrupt freeing
+ * logic etc).
+ */
+ if (irq >= NR_IRQS)
+ return -EINVAL;
+ if (!handler)
+ return -EINVAL;
+
+ action = xmalloc(struct irqaction);
+ if (!action)
+ return -ENOMEM;
+
+ action->handler = handler;
+ action->name = devname;
+ action->dev_id = dev_id;
+
+ retval = setup_irq(irq, action);
+ if (retval)
+ xfree(action);
+
+ return retval;
+}
+
void free_irq(unsigned int irq)
{
unsigned int vector = irq_to_vector(irq);
if ( (action->ack_type != ACKTYPE_NONE) &&
!test_and_set_bit(irq, d->pirq_mask) )
action->in_flight++;
- send_guest_pirq(d, irq);
+ if (!hvm_do_IRQ_dpci(d, irq))
+ send_guest_pirq(d, irq);
+
}
}
_initrd_len = mod[initrdidx].mod_end - mod[initrdidx].mod_start;
}
+ iommu_setup();
+
/*
* We're going to setup domain0 using the module(s) that we stashed safely
* above our heap. The second module, if present, is an initrd ramdisk.
extern int setup_irq(unsigned int, struct irqaction *);
extern void free_irq(unsigned int);
+extern int request_irq(unsigned int irq,
+ void (*handler)(int, void *, struct cpu_user_regs *),
+ unsigned long irqflags, const char * devname, void *dev_id);
extern hw_irq_controller no_irq_type;
extern void no_action(int cpl, void *dev_id, struct cpu_user_regs *regs);